<!DOCTYPE html>

































































<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="shortcut icon" type="image/x-icon" href="../../../favicon.ico" />
<title>Bluetooth | Android Developers</title>
<link href="../../../assets/android-developer-docs-devguide.css" rel="stylesheet" type="text/css" />
<script src="../../../assets/search_autocomplete.js" type="text/javascript"></script>
<script src="../../../assets/jquery-resizable.min.js" type="text/javascript"></script>
<script src="../../../assets/android-developer-docs.js" type="text/javascript"></script>
<script src="../../../assets/prettify.js" type="text/javascript"></script>
<script type="text/javascript">
  setToRoot("../../../");
</script>
<noscript>
  <style type="text/css">
    html,body{overflow:auto;}
    #body-content{position:relative; top:0;}
    #doc-content{overflow:visible;border-left:3px solid #666;}
    #side-nav{padding:0;}
    #side-nav .toggle-list ul {display:block;}
    #resize-packages-nav{border-bottom:3px solid #666;}
  </style>
</noscript>
</head>
<body class="gc-documentation">

  <div id="header">
      <div id="headerLeft">
          <a href="../../../index.html" tabindex="-1"><img
              src="../../../assets/images/bg_logo.png" alt="Android Developers" /></a>
          <ul id="header-tabs" class="guide">
    
	<li id="home-link"><a href="../../../offline.html">
	
		<span class="en">Home</span>
		<span style="display:none" class="de">Startseite</span>
		<span style="display:none" class="es"></span>
		<span style="display:none" class="fr"></span>
		<span style="display:none" class="it"></span>
		<span style="display:none" class="ja">ホーム</span>
		<span style="display:none" class="zh-CN">主页</span>
		<span style="display:none" class="zh-TW">首頁</span>
	
	</a></li>
	<li id="sdk-link"><a href="../../../sdk/index.html">
		<span class="en">SDK</span>
	</a></li>
	<li id="guide-link"><a href="../../../guide/index.html" onClick="return loadLast('guide')">
	
		<span class="en">Dev Guide</span>
		<span style="display:none" class="de">Handbuch</span>
		<span style="display:none" class="es">Guía</span>
		<span style="display:none" class="fr">Guide</span>
		<span style="display:none" class="it">Guida</span>
		<span style="display:none" class="ja">開発ガイド</span>
		<span style="display:none" class="zh-CN">开发人员指南</span>
		<span style="display:none" class="zh-TW">開發指南</span>
	
	</a></li>
	<li id="reference-link"><a href="../../../reference/packages.html" onClick="return loadLast('reference')">
	
		<span class="en">Reference</span>
		<span style="display:none" class="de">Referenz</span>
		<span style="display:none" class="es">Referencia</span>
		<span style="display:none" class="fr">Référence</span>
		<span style="display:none" class="it">Riferimento</span>
		<span style="display:none" class="ja">リファレンス</span>
		<span style="display:none" class="zh-CN">参考</span>
		<span style="display:none" class="zh-TW">參考資料</span>
	
	</a></li>
	<li id="resources-link"><a href="../../../resources/index.html" onClick="return loadLast('resources')">
	
		<span class="en">Resources</span>
		<span style="display:none" class="de"></span>
		<span style="display:none" class="es"></span>
		<span style="display:none" class="fr"></span>
		<span style="display:none" class="it"></span>
    		<span style="display:none" class="ja"></span>
		<span style="display:none" class="zh-CN"></span>
		<span style="display:none" class="zh-TW"></span>
	
	</a></li>
	<li id="videos-link"><a href="../../../videos/index.html" onClick="return loadLast('videos')">
	
		<span class="en">Videos</span>
		<span style="display:none" class="de"></span>
		<span style="display:none" class="es"></span>
		<span style="display:none" class="fr"></span>
		<span style="display:none" class="it"></span>
		<span style="display:none" class="ja">ビデオ</span>
		<span style="display:none" class="zh-CN"></span>
		<span style="display:none" class="zh-TW"></span>
	
	</a></li>
	<li><a href="http://android-developers.blogspot.com" onClick="return requestAppendHL(this.href)">
	
		<span class="en">Blog</span>
		<span style="display:none" class="de"></span>
		<span style="display:none" class="es"></span>
		<span style="display:none" class="fr"></span>
		<span style="display:none" class="it"></span>
		<span style="display:none" class="ja">ブログ</span>
		<span style="display:none" class="zh-CN">博客</span>
		<span style="display:none" class="zh-TW">網誌</span>
	
	</a></li>


     
</ul>
     
      </div>
      <div id="headerRight">
          <div id="headerLinks">
          
          <a href="http://www.android.com">Android.com</a>
          </div>
  <div id="search" >
      <div id="searchForm">
          <form accept-charset="utf-8" class="gsc-search-box" 
                onsubmit="return submit_search()">
            <table class="gsc-search-box" cellpadding="0" cellspacing="0"><tbody>
                <tr>
                  <td class="gsc-input">
                    <input id="search_autocomplete" class="gsc-input" type="text" size="33" autocomplete="off"
                      title="search developer docs" name="q"
                      value="search developer docs"
                      onFocus="search_focus_changed(this, true)"
                      onBlur="search_focus_changed(this, false)"
                      onkeydown="return search_changed(event, true, '../../../')"
                      onkeyup="return search_changed(event, false, '../../../')" />
                  <div id="search_filtered_div" class="no-display">
                      <table id="search_filtered" cellspacing=0>
                      </table>
                  </div>
                  </td>
                  <td class="gsc-search-button">
                    <input type="submit" value="Search" title="search" id="search-button" class="gsc-search-button" />
                  </td>
                  <td class="gsc-clear-button">
                    <div title="clear results" class="gsc-clear-button">&nbsp;</div>
                  </td>
                </tr></tbody>
              </table>
          </form>
      </div><!-- searchForm -->
  </div><!-- search -->
      </div><!-- headerRight -->
      <script type="text/javascript">
        <!--  
        changeTabLang(getLangPref());
        //-->
      </script>
  </div><!-- header -->

  <div class="g-section g-tpl-240" id="body-content">
    <div class="g-unit g-first" id="side-nav">
      <div id="devdoc-nav">
<ul>

  <li>
    <h2><span class="en">Android Basics</span>
        <span class="de" style="display:none">Einführung in Android</span>
        <span class="es" style="display:none">Información básica sobre Android</span>
        <span class="fr" style="display:none">Présentation d'Android</span>
        <span class="it" style="display:none">Nozioni di base su Android</span>
        <span class="ja" style="display:none">Android の基本</span>
        <span class="zh-CN" style="display:none">Android 基础知识</span>
        <span class="zh-TW" style="display:none">Android 簡介</span>
    </h2>
    <ul>
      <li><a href="../../../guide/basics/what-is-android.html">
        <span class="en">What Is Android?</span>
        <span class="de" style="display:none">Was ist Android?</span>
        <span class="es" style="display:none">¿Qué es Android?</span>
        <span class="fr" style="display:none">Qu'est-ce qu'Android&nbsp;?</span>
        <span class="it" style="display:none">Che cos'è Android?</span>
        <span class="ja" style="display:none">Android とは</span>
        <span class="zh-CN" style="display:none">Android 是什么？</span>
        <span class="zh-TW" style="display:none">什麼是 Android？</span>
          </a></li>
      <li><a href="../../../guide/topics/fundamentals.html">
        <span class="en">Application Fundamentals</span>
        <span class="de" style="display:none">Anwendungsgrundlagen</span>
        <span class="es" style="display:none">Fundamentos de las aplicaciones</span>
        <span class="fr" style="display:none">Principes de base des applications</span>
        <span class="it" style="display:none">Concetti fondamentali sulle applicazioni</span>
        <span class="ja" style="display:none">開発の基礎</span>
        <span class="zh-CN" style="display:none">应用程序基础</span>
        <span class="zh-TW" style="display:none">應用程式基本原理</span>
      </a></li>

  <!--  <li><a style="color:gray;">The Android SDK</a></li> -->
  <!--  <li><a style="color:gray;">Walkthrough for Developers</a></li> -->
      <!-- quick overview of what it's like to develop on Android -->
    </ul>
  </li>

  <li>
    <h2>
      <span class="en">Framework Topics</span>
      <span class="de" style="display:none">Framework-Themen</span>
      <span class="es" style="display:none">Temas sobre el framework</span>
      <span class="fr" style="display:none">Thèmes relatifs au framework</span>
      <span class="it" style="display:none">Argomenti relativi al framework</span>
      <span class="ja" style="display:none">フレームワーク トピック</span>
      <span class="zh-CN" style="display:none">框架主题</span>
      <span class="zh-TW" style="display:none">架構主題</span>
    </h2>
    <ul>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/fundamentals/activities.html">
          <span class="en">Activities</span>
        </a></div>
        <ul>
          <li><a href="../../../guide/topics/fundamentals/fragments.html">
            <span class="en">Fragments</span>
          </a></li>
          <li><a href="../../../guide/topics/fundamentals/loaders.html">
            <span class="en">Loaders</span>
          </a></li>
          <li><a href="../../../guide/topics/fundamentals/tasks-and-back-stack.html">
            <span class="en">Tasks and Back Stack</span></a></li>
        </ul>
      </li>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/fundamentals/services.html">
          <span class="en">Services</span>
        </a></div>
        <ul>
          <li><a href="../../../guide/topics/fundamentals/bound-services.html">
            <span class="en">Bound Services</span>
          </a></li>
        </ul>
      </li>
      <li><a href="../../../guide/topics/providers/content-providers.html">
            <span class="en">Content Providers</span>
          </a></li>
      <li><a href="../../../guide/topics/intents/intents-filters.html">
            <span class="en">Intents and Intent Filters</span>
          </a></li>
      <li><a href="../../../guide/topics/fundamentals/processes-and-threads.html">
            <span class="en">Processes and Threads</span>
          </a></li>
    </ul>


    <ul>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/ui/index.html">
            <span class="en">User Interface</span>
          </a></div>
        <ul>
          <li><a href="../../../guide/topics/ui/declaring-layout.html">
               <span class="en">XML Layouts</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/ui-events.html">
                <span class="en">Input Events</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/menus.html">
               <span class="en">Menus</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/actionbar.html">
               <span class="en">Action Bar</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/dialogs.html">
                <span class="en">Dialogs</span>
              </a></li>
          <li class="toggle-list">
            <div><a href="../../../guide/topics/ui/notifiers/index.html">
                <span class="en">Notifications</span>
            </a></div>
            <ul>
              <li><a href="../../../guide/topics/ui/notifiers/toasts.html">
                <span class="en">Toast Notifications</span>
              </a></li>
              <li><a href="../../../guide/topics/ui/notifiers/notifications.html">
                <span class="en">Status Bar Notifications</span>
              </a></li>
            </ul>
          </li>
          <li><a href="../../../guide/topics/ui/drag-drop.html">
                <span class="en">Drag and Drop</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/themes.html">
                <span class="en">Styles and Themes</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/custom-components.html">
                <span class="en">Custom Components</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/binding.html">
                <span class="en">Binding to Data with AdapterView</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/layout-objects.html">
                <span class="en">Common Layout Objects</span>
              </a></li>
          <li><a href="../../../guide/topics/ui/how-android-draws.html">
                <span class="en">How Android Draws Views</span>
              </a></li>
        </ul>
      </li><!-- end of User Interface -->

      <li class="toggle-list">
        <div><a href="../../../guide/topics/resources/index.html">
               <span class="en">Application Resources</span>
             </a></div>
        <ul>
          <li><a href="../../../guide/topics/resources/providing-resources.html">
                <span class="en">Providing Resources</span>
              </a></li>
          <li><a href="../../../guide/topics/resources/accessing-resources.html">
                <span class="en">Accessing Resources</span>
              </a></li>
          <li><a href="../../../guide/topics/resources/runtime-changes.html">
                <span class="en">Handling Runtime Changes</span>
              </a></li>
          <li><a href="../../../guide/topics/resources/localization.html">
                <span class="en">Localization</span>
              </a></li>
          <li class="toggle-list">
            <div><a href="../../../guide/topics/resources/available-resources.html">
              <span class="en">Resource Types</span>
            </a></div>
            <ul>
              <li><a href="../../../guide/topics/resources/animation-resource.html">Animation</a></li>
              <li><a href="../../../guide/topics/resources/color-list-resource.html">Color State List</a></li>
              <li><a href="../../../guide/topics/resources/drawable-resource.html">Drawable</a></li>
              <li><a href="../../../guide/topics/resources/layout-resource.html">Layout</a></li>
              <li><a href="../../../guide/topics/resources/menu-resource.html">Menu</a></li>
              <li><a href="../../../guide/topics/resources/string-resource.html">String</a></li>
              <li><a href="../../../guide/topics/resources/style-resource.html">Style</a></li>
              <li><a href="../../../guide/topics/resources/more-resources.html">More Types</a></li>
            </ul>
          </li><!-- end of resource types -->
        </ul>
      </li><!-- end of app resources -->
      <li class="toggle-list">
        <div><a href="../../../guide/topics/data/data-storage.html">
            <span class="en">Data Storage</span>
          </a></div>
          <ul>
            <li><a href="../../../guide/topics/data/backup.html">
                <span class="en">Data Backup</span>
              </a>
            </li>
          </ul>
      </li>
      <li><a href="../../../guide/topics/security/security.html">
            <span class="en">Security and Permissions</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/manifest/manifest-intro.html">
          <span class="en">The AndroidManifest.xml File</span>
        </a></div>
        <ul>
          <li><a href="../../../guide/topics/manifest/action-element.html">&lt;action&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/activity-alias-element.html">&lt;activity-alias&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/application-element.html">&lt;application&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/category-element.html">&lt;category&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/compatible-screens-element.html">&lt;compatible-screens&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/data-element.html">&lt;data&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/grant-uri-permission-element.html">&lt;grant-uri-permission&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/instrumentation-element.html">&lt;instrumentation&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/intent-filter-element.html">&lt;intent-filter&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/meta-data-element.html">&lt;meta-data&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/path-permission-element.html">&lt;path-permission&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/permission-element.html">&lt;permission&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/permission-group-element.html">&lt;permission-group&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/permission-tree-element.html">&lt;permission-tree&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/provider-element.html">&lt;provider&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/receiver-element.html">&lt;receiver&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/service-element.html">&lt;service&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/supports-gl-texture-element.html">&lt;supports-gl-texture&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/supports-screens-element.html">&lt;supports-screens&gt;</a></li><!-- ##api level 4## -->
          <li><a href="../../../guide/topics/manifest/uses-configuration-element.html">&lt;uses-configuration&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/uses-feature-element.html">&lt;uses-feature&gt;</a></li> <!-- ##api level 4## -->
          <li><a href="../../../guide/topics/manifest/uses-library-element.html">&lt;uses-library&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></li>
          <li><a href="../../../guide/topics/manifest/uses-sdk-element.html">&lt;uses-sdk&gt;</a></li>
        </ul>
      </li><!-- end of the manifest file -->
    </ul>

    <ul>
    <li class="toggle-list">
        <div><a href="../../../guide/topics/graphics/index.html">
            <span class="en">Graphics</span>
          </a><span class="new-child">new!</span></div>
        <ul>
          <li><a href="../../../guide/topics/graphics/2d-graphics.html">
              <span class="en">Canvas and Drawables</span></a></li>
          <li><a href="../../../guide/topics/graphics/hardware-accel.html">
              <span class="en">Hardware Acceleration</span></a>
            <span class="new">new!</span></li>
          <li><a href="../../../guide/topics/graphics/opengl.html">
              <span class="en">OpenGL</span>
            </a><span class="new">updated</span></li>
        </ul>
      </li>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/graphics/animation.html">
            <span class="en">Animation</span>
          </a></div>
        <ul>
          <li><a href="../../../guide/topics/graphics/prop-animation.html">
              <span class="en">Property Animation</span></a></li>
          <li><a href="../../../guide/topics/graphics/view-animation.html">
              <span class="en">View Animation</span></a></li>
          <li><a href="../../../guide/topics/graphics/drawable-animation.html">
              <span class="en">Drawable Animation</span></a></li>
        </ul>
      </li>
      <li class="toggle-list">
	        <div><a href="../../../guide/topics/renderscript/index.html">
	            <span class="en">RenderScript</span>
	          </a></div>
	        <ul>
	          <li><a href="../../../guide/topics/renderscript/graphics.html">
	                <span class="en">Graphics</span>
	              </a>
	          </li>
	          <li><a href="../../../guide/topics/renderscript/compute.html">
	                <span class="en">Compute</span>
	              </a>
	          </li>
	        </ul>
  	  </li>

      <li class="toggle-list">
          <div><a href="../../../guide/topics/media/index.html">
            <span class="en">Multimedia and Camera</span>
          </a><span class="new">updated</span></div>
          <ul>
            <li><a href="../../../guide/topics/media/mediaplayer.html">
                  <span class="en">Media Playback</span></a>
                </li>
            <li><a href="../../../guide/topics/media/jetplayer.html">
                  <span class="en">JetPlayer</span></a>
                </li>
            <li><a href="../../../guide/topics/media/camera.html">
                  <span class="en">Camera</span></a>
                  <span class="new">new!</span>
                </li>
            <li><a href="../../../guide/topics/media/audio-capture.html">
                  <span class="en">Audio Capture</span></a>
                </li>
          </ul>
      </li>
      <li>
        <a href="../../../guide/topics/clipboard/copy-paste.html">
            <span class="en">Copy and Paste</span>
        </a></li>
  <!--<li class="toggle-list">
        <div><a style="color:gray;">Sensors</a></div>
          <ul>
            <li><a style="color:gray;">Camera</a></li>
            <li><a style="color:gray;">Compass</a></li>
            <li><a style="color:gray;">Accelerometer</a></li>
          </ul>
      </li> -->
      <li class="toggle-list">
        <div><a href="../../../guide/topics/location/index.html">
               <span class="en">Location and Maps</span>
             </a></div>
        <ul>
          <li><a href="../../../guide/topics/location/obtaining-user-location.html">
                <span class="en">Obtaining User Location</span>
              </a></li>
        </ul>
      </li>
  <!--<li class="toggle-list">
        <div><a style="color:gray;">Wireless Controls</a></div>
          <ul>
            <li><a style="color:gray;">Wi-Fi</a></li>
          </ul>
      </li> -->
  <!--<li><a style="color:gray;">Localization</a></li>  -->
      <li><a href="../../../guide/topics/appwidgets/index.html">
            <span class="en">App Widgets</span></a>
          </li>
      <li><a href="../../../guide/topics/wireless/bluetooth.html">
            <span class="en">Bluetooth</span></a>
          </li>
      <li><a href="../../../guide/topics/nfc/index.html">
            <span class="en">Near Field Communication</span>
          </a></li>
      <li class="toggle-list">
          <div><a href="../../../guide/topics/usb/index.html">
            <span class="en">USB</span></a>
          </div>
            <ul>
              <li><a href="../../../guide/topics/usb/accessory.html">Accessory</a></li>
              <li><a href="../../../guide/topics/usb/host.html">Host</a></li>
              <li><a href="../../../guide/topics/usb/adk.html">Open Accessory Dev Kit</a></li>
            </ul>
          </li>

       <li><a href="../../../guide/topics/network/sip.html">
            <span class="en">Session Initiation Protocol</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/topics/search/index.html">
            <span class="en">Search</span>
          </a></div>
          <ul>
            <li><a href="../../../guide/topics/search/search-dialog.html">Creating a Search Interface</a></li>
            <li><a href="../../../guide/topics/search/adding-recent-query-suggestions.html">Adding Recent Query Suggestions</a></li>
            <li><a href="../../../guide/topics/search/adding-custom-suggestions.html">Adding Custom Suggestions</a></li>
            <li><a href="../../../guide/topics/search/searchable-config.html">Searchable Configuration</a></li>
          </ul>
      </li>
      <li><a href="../../../guide/topics/admin/device-admin.html">
            <span class="en">Device Administration</span></a>
      </li>
      <li class="toggle-list">
           <div>
                <a href="../../../guide/topics/testing/index.html">
                   <span class="en">Testing</span>
               </a>
           </div>
           <ul>
              <li>
                <a href="../../../guide/topics/testing/testing_android.html">
                <span class="en">Testing Fundamentals</span></a>
              </li>
              <li>
                <a href="../../../guide/topics/testing/activity_testing.html">
                <span class="en">Activity Testing</span></a>
              </li>
              <li>
                <a href="../../../guide/topics/testing/contentprovider_testing.html">
                <span class="en">Content Provider Testing</span></a>
              </li>
              <li>
                <a href="../../../guide/topics/testing/service_testing.html">
                <span class="en">Service Testing</span></a>
              </li>
              <li>
                <a href="../../../guide/topics/testing/what_to_test.html">
                <span class="en">What To Test</span></a>
              </li>
           </ul>
      </li>
    </ul>
  </li>

  <li>
    <h2>
      <span class="en">Android Market Topics</span>
    </h2>
    <ul>
      <li><a href="../../../guide/publishing/licensing.html">
          <span class="en">Application Licensing</span></a>
      </li>
      <li class="toggle-list">
        <div><a href="../../../guide/market/billing/index.html">
            <span class="en">In-app Billing</span></a>
        </div>
        <ul>
          <li><a href="../../../guide/market/billing/billing_overview.html">
              <span class="en">In-app Billing Overview</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_integrate.html">
              <span class="en">Implementing In-app Billing</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_best_practices.html">
              <span class="en">Security and Design</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_testing.html">
              <span class="en">Testing In-app Billing</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_admin.html">
              <span class="en">Administering In-app Billing</span></a>
          </li>
          <li><a href="../../../guide/market/billing/billing_reference.html">
              <span class="en">In-app Billing Reference</span></a>
          </li>
        </ul>
      </li>
      <li><a href="../../../guide/appendix/market-filters.html">
          <span class="en">Market Filters</span></a>
      </li>
      <li><a href="../../../guide/market/publishing/multiple-apks.html">
          <span class="en">Multiple APK Support</span></a>
      </li>
    </ul>
  </li>


  <li>
    <h2><span class="en">Developing</span>
               <span class="de" style="display:none">Entwicklung</span>
               <span class="es" style="display:none">Desarrollo</span>
               <span class="fr" style="display:none">Développement</span>
               <span class="it" style="display:none">Sviluppo</span>
               <span class="ja" style="display:none">開発</span>
               <span class="zh-CN" style="display:none">开发</span>
               <span class="zh-TW" style="display:none">開發</span>
    </h2>
    <ul>
  <!--<li><a href="">Developing for Android</a></li>
      signing, upgrading, selecting a package name, select device profile, touch, trackball, dpad available, etc. -->
      <li>
        <a href="../../../guide/developing/index.html">
        <span class="en">Introduction</span></a>
      </li>

      <li class="toggle-list">
        <div>
           <a href="../../../guide/developing/devices/index.html">
                <span class="en">Managing Virtual Devices</span>
            </a>
        </div>
        <ul>
          <li>
            <a href="../../../guide/developing/devices/managing-avds.html">
              <span class="en">With AVD Manager</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/devices/managing-avds-cmdline.html">
              <span class="en">From the Command Line</span>
            </a>
          </li>
          <li>
           <a href="../../../guide/developing/devices/emulator.html">
                <span class="en">Using the Android Emulator</span>
            </a>
          </li>
        </ul>
      </li>
      <li>
        <a href="../../../guide/developing/device.html">
          <span class="en">Using Hardware Devices</span>
        </a>
      </li>

      <li class="toggle-list">
        <div>
          <a href="../../../guide/developing/projects/index.html">
            <span class="en">Managing Projects</span>
          </a>
        </div>
        <ul>
          <li>
            <a href="../../../guide/developing/projects/projects-eclipse.html">
              <span class="en">From Eclipse with ADT</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/projects/projects-cmdline.html">
                <span class="en">From the Command Line</span>
            </a>
          </li>
        </ul>
      </li>

      <li class="toggle-list">
        <div>
          <a href="../../../guide/developing/building/index.html">
            <span class="en">Building and Running</span>
          </a>
        </div>
        <ul>
          <li><a href="../../../guide/developing/building/building-eclipse.html">
            <span class="en">From Eclipse with ADT</span>
          </a></li>
          <li><a href="../../../guide/developing/building/building-cmdline.html">
            <span class="en">From the Command Line</span></a></li>
        </ul>
      </li>

      <li class="toggle-list">
        <div>
          <a href="../../../guide/developing/debugging/index.html">
            <span class="en">Debugging</span>
          </a>
        </div>
        <ul>
          <li>
            <a href="../../../guide/developing/debugging/debugging-projects.html">
                <span class="en">From Eclipse with ADT</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-projects-cmdline.html">
                <span class="en">From Other IDEs</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/ddms.html">
              <span class="en">Using DDMS</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-log.html">
                <span class="en">Reading and Writing Logs</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-ui.html">
                <span class="en">Debugging and Profiling UIs</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-tracing.html">
                <span class="en">Profiling with Traceview and dmtracedump</span>
            </a>
          </li>
          <li>
            <a href="../../../guide/developing/debugging/debugging-devtools.html">
                <span class="en">Using the Dev Tools App</span>
            </a>
          </li>
        </ul>
      </li>

      <li class="toggle-list">
           <div>
                <a href="../../../guide/developing/testing/index.html">
                   <span class="en">Testing</span>
               </a>
           </div>
           <ul>
              <li>
                <a href="../../../guide/developing/testing/testing_eclipse.html">
                  <span class="en">From Eclipse with ADT</span>
                </a>
              </li>

              <li>
                <a href="../../../guide/developing/testing/testing_otheride.html">
                  <span class="en">From Other IDEs</span>
                </a>
              </li>
           </ul>
         </li>

         <li class="toggle-list">
        <div><a href="../../../guide/developing/tools/index.html">
            <span class="en">Tools</span>
          </a></div>
        <ul>
          <li><a href="../../../guide/developing/tools/adb.html">adb</a></li>
          <li><a href="../../../guide/developing/tools/adt.html">ADT</a></li>
          <li><a href="../../../guide/developing/tools/android.html">android</a></li>
          <li><a href="../../../guide/developing/tools/bmgr.html">bmgr</a>
          <li><a href="../../../guide/developing/tools/dmtracedump.html">dmtracedump</a></li>
          <li><a href="../../../guide/developing/tools/draw9patch.html">Draw
          9-Patch</a></li>
          <li><a href="../../../guide/developing/tools/emulator.html">Emulator</a></li>
          <li><a href="../../../guide/developing/tools/etc1tool.html">etc1tool</a></li>
          <li><a href="../../../guide/developing/tools/hierarchy-viewer.html">Hierarchy Viewer</a></li>
          <li><a href="../../../guide/developing/tools/hprof-conv.html">hprof-conv</a></li>
          <li><a href="../../../guide/developing/tools/layoutopt.html">layoutopt</a></li>
          <li><a href="../../../guide/developing/tools/logcat.html">logcat</a></li>
          <li><a href="../../../guide/developing/tools/mksdcard.html">mksdcard</a></li>
          <li><a href="../../../guide/developing/tools/monkey.html">Monkey</a></li>
          <li class="toggle-list">
            <div><a href="../../../guide/developing/tools/monkeyrunner_concepts.html">
              <span class="en">monkeyrunner</span>
            </a></div>
            <ul>
              <li><a href="../../../guide/developing/tools/MonkeyDevice.html">
                <span class="en">MonkeyDevice</span>
                </a></li>
              <li><a href="../../../guide/developing/tools/MonkeyImage.html">
                <span class="en">MonkeyImage</span>
                </a></li>
              <li><a href="../../../guide/developing/tools/MonkeyRunner.html">
                <span class="en">MonkeyRunner</span>
                </a></li>
            </ul>
          </li>
          <li><a href="../../../guide/developing/tools/proguard.html">ProGuard</a></li>
          <li><a href="../../../guide/developing/tools/adb.html#sqlite">sqlite3</a></li>
          <li><a href="../../../guide/developing/tools/traceview.html">Traceview</a></li>
          <li><a href="../../../guide/developing/tools/zipalign.html">zipalign</a></li>
        </ul>
      </li>
    </ul>
  </li>

  <li>
    <h2><span class="en">Publishing</span>
        <span class="de" style="display:none">Veröffentlichung</span>
        <span class="es" style="display:none">Publicación</span>
        <span class="fr" style="display:none">Publication</span>
        <span class="it" style="display:none">Pubblicazione</span>
        <span class="ja" style="display:none">公開</span>
        <span class="zh-CN" style="display:none">发布</span>
        <span class="zh-TW" style="display:none">發佈</span>
    </h2>
    <ul>
      <li><a href="../../../guide/publishing/app-signing.html">
            <span class="en">Signing Your Applications</span>
            <span class="de" style="display:none">Signieren Ihrer Anwendungen</span>
            <span class="es" style="display:none">Firma de aplicaciones</span>
            <span class="fr" style="display:none">Attribution de votre signature <br />à vos applications</span>
            <span class="it" style="display:none">Firma delle applicazioni</span>
            <span class="ja" style="display:none">アプリケーションへの署名</span>
            <span class="zh-CN" style="display:none">应用程序签名</span>
            <span class="zh-TW" style="display:none">簽署應用程式</span>
          </a></li>
      <li><a href="../../../guide/publishing/versioning.html">
            <span class="en">Versioning Your Applications</span>
            <span class="de" style="display:none">Versionsverwaltung für Ihre <br />Anwendungen</span>
            <span class="es" style="display:none">Versiones de las aplicaciones</span>
            <span class="fr" style="display:none">Attribution d'une version à vos applications</span>
            <span class="it" style="display:none">Controllo versioni delle applicazioni</span>
            <span class="ja" style="display:none">アプリケーションのバージョニング</span>
            <span class="zh-CN" style="display:none">应用程序版本控制</span>
            <span class="zh-TW" style="display:none">應用程式版本設定</span>
          </a></li>
      <li><a href="../../../guide/publishing/preparing.html">
            <span class="en">Preparing to Publish</span>
            <span class="de" style="display:none">Vorbereitung auf die Veröffentlichung</span>
            <span class="es" style="display:none">Publicación de aplicaciones</span>
            <span class="fr" style="display:none">Préparation à la publication</span>
            <span class="it" style="display:none">Preparativi per la pubblicazione</span>
            <span class="ja" style="display:none">公開の準備</span>
            <span class="zh-CN" style="display:none">准备发布</span>
            <span class="zh-TW" style="display:none">準備發佈</span>
          </a></li>
      <li><a href="../../../guide/publishing/publishing.html">
            <span class="en">Publishing on Android Market</span>
          </a></li>
    </ul>
  </li>

  <li>
    <h2><span class="en">Best Practices</span>
               <span class="de" style="display:none">Bewährte Verfahren</span>
               <span class="es" style="display:none">Prácticas recomendadas</span>
               <span class="fr" style="display:none">Meilleures pratiques</span>
               <span class="it" style="display:none">Best practice</span>
               <span class="ja" style="display:none">ベスト プラクティス</span>
               <span class="zh-CN" style="display:none">最佳实践</span>
               <span class="zh-TW" style="display:none">最佳實務</span>
    </h2>
    <ul>
      <li><a href="../../../guide/practices/compatibility.html">
            <span class="en">Compatibility</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/practices/screens_support.html">
          <span class="en">Supporting Multiple Screens</span>
        </a></div>
        <ul>
          <li><a href="../../../guide/practices/screens-distribution.html">
            <span class="en">Distributing to Specific Screens</span>
          </a></li>
          <li><a href="../../../guide/practices/screen-compat-mode.html">
            <span class="en">Screen Compatibility Mode</span>
          </a></li>
          <li><a href="../../../guide/practices/screens-support-1.5.html">
            <span class="en">Strategies for Android 1.5</span>
          </a></li>
        </ul>
      </li>
      <li><a href="../../../guide/practices/optimizing-for-3.0.html">
            <span class="en">Optimizing Apps for Android 3.0</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/practices/ui_guidelines/index.html">
               <span class="en">UI Guidelines</span>
             </a></div>
        <ul>
          <li class="toggle-list">
            <div><a href="../../../guide/practices/ui_guidelines/icon_design.html">
                   <span class="en">Icon Design <span class="new">updated</span></span>
                 </a></div>
            <ul>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_launcher.html">
                    <span class="en">Launcher Icons <span class="new">updated</span></span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_menu.html">
                    <span class="en">Menu Icons</span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_action_bar.html">
                    <span class="en">Action Bar Icons <span class="new">new!</span></span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_status_bar.html">
                    <span class="en">Status Bar Icons <span class="new">updated</span></span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_tab.html">
                    <span class="en">Tab Icons</span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_dialog.html">
                    <span class="en">Dialog Icons</span>
                  </a></li>
              <li><a href="../../../guide/practices/ui_guidelines/icon_design_list.html">
                    <span class="en">List View Icons</span>
                  </a></li>
            </ul>
          </li>
          <li><a href="../../../guide/practices/ui_guidelines/widget_design.html">
                <span class="en">App Widget Design <span class="new">updated</span></span>
              </a></li>
          <li><a href="../../../guide/practices/ui_guidelines/activity_task_design.html">
                <span class="en">Activity and Task Design</span>
              </a></li>
          <li><a href="../../../guide/practices/ui_guidelines/menu_design.html">
                <span class="en">Menu Design</span>
              </a></li>
        </ul>
      </li>
      </ul>
      <ul>
      <li><a href="../../../guide/practices/design/accessibility.html">
            <span class="en">Designing for Accessibility</span>
          </a></li>
      <li class="toggle-list">
        <div><a href="../../../guide/practices/design/performance.html">
            <span class="en">Designing for Performance</span>
          </a></div>
        <ul>
          <li><a href="../../../guide/practices/design/jni.html">
                <span class="en">JNI Tips</span>
              </a></li>
        </ul>
      </li>
      <li><a href="../../../guide/practices/design/responsiveness.html">
            <span class="en">Designing for Responsiveness</span>
          </a></li>
      <li><a href="../../../guide/practices/design/seamlessness.html">
            <span class="en">Designing for Seamlessness</span>
          </a></li>
    </ul>
  </li>

  <li>
    <h2><span class="en">Web Applications</span>
    </h2>
    <ul>
      <li><a href="../../../guide/webapps/index.html">
            <span class="en">Web Apps Overview</span>
          </a></li>
      <li><a href="../../../guide/webapps/targeting.html">
            <span class="en">Targeting Screens from Web Apps</span>
          </a></li>
      <li><a href="../../../guide/webapps/webview.html">
            <span class="en">Building Web Apps in WebView</span>
          </a></li>
      <li><a href="../../../guide/webapps/debugging.html">
            <span class="en">Debugging Web Apps</span>
          </a></li>
      <li><a href="../../../guide/webapps/best-practices.html">
            <span class="en">Best Practices for Web Apps</span>
          </a></li>
    </ul>
  </li>

  <li>
    <h2><span class="en">Appendix</span>
               <span class="de" style="display:none">Anhang</span>
               <span class="es" style="display:none">Apéndice</span>
               <span class="fr" style="display:none">Annexes</span>
               <span class="it" style="display:none">Appendice</span>
               <span class="ja" style="display:none">付録</span>
               <span class="zh-CN" style="display:none">附录</span>
               <span class="zh-TW" style="display:none">附錄</span>
    </h2>
    <ul>
      <li><a href="../../../guide/appendix/api-levels.html">
            <span class="en">Android API Levels</span>
          </a></li>
      <li><a href="../../../guide/appendix/install-location.html">
            <span class="en">App Install Location</span>
          </a></li>
      <li><a href="../../../guide/appendix/media-formats.html">
            <span class="en">Supported Media Formats <span class="new">updated</span></span>
          </a></li>
      <li><a href="../../../guide/appendix/g-app-intents.html">
            <span class="en">Intents List: Google Apps</span>
          </a></li>
      <li><a href="../../../guide/developing/tools/aidl.html">AIDL</a></li>
      <li><a href="../../../guide/appendix/glossary.html">
            <span class="en">Glossary</span>
          </a></li>
    </ul>
  </li>

</ul>

<script type="text/javascript">
<!--
    buildToggleLists();
    changeNavLang(getLangPref());
//-->
</script>

      </div>
    </div> <!-- end side-nav -->
    <script>
      addLoadEvent(function() {
        scrollIntoView("devdoc-nav");
        });
    </script>




<div class="g-unit" id="doc-content"><a name="top"></a>

<div id="jd-header" class="guide-header">
  <span class="crumb">
    &nbsp;
    
  </span>
<h1>Bluetooth</h1>
</div>

  <div id="jd-content">

    <div class="jd-descr">
    <div id="qv-wrapper"> 
<div id="qv"> 
 
  <h2>Quickview</h2> 
  <ul> 
    <li>Android's bluetooth APIs allow your application to perform wireless data transactions with
other devices</li> 
  </ul> 
 
  <h2>In this document</h2> 
  <ol> 
    <li><a href="#TheBasics">The Basics</a></li> 
    <li><a href="#Permissions">Bluetooth Permissions</a></li> 
    <li><a href="#SettingUp">Setting Up Bluetooth</a></li> 
    <li><a href="#FindingDevices">Finding Devices</a> 
      <ol> 
        <li><a href="#QueryingPairedDevices">Querying paired devices</a></li> 
        <li><a href="#DiscoveringDevices">Discovering devices</a></li> 
      </ol></li> 
    <li><a href="#ConnectingDevices">Connecting Devices</a> 
      <ol> 
        <li><a href="#ConnectingAsAServer">Connecting as a server</a></li> 
        <li><a href="#ConnectingAsAClient">Connecting as a client</a></li> 
      </ol></li> 
    <li><a href="#ManagingAConnection">Managing a Connection</a></li>
    <li><a href="#Profiles">Working with Profiles</a> 
      <ol>
        <li><a href="#AT-Commands">Vendor-specific AT commands</a>
      </ol></li>
  </ol> 
 
  <h2>Key classes</h2> 
  <ol> 
    <li><code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code></li> 
    <li><code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code></li> 
    <li><code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code></li> 
    <li><code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code></li> 
  </ol> 
 
  <h2>Related samples</h2> 
  <ol> 
    <li><a href="../../../resources/samples/BluetoothChat/index.html">Bluetooth Chat</a></li> 
  </ol> 
 
</div> 
</div> 
 
 
<p>The Android platform includes support for the Bluetooth network stack,
which allows a device to wirelessly exchange data with other Bluetooth devices.
The application framework provides access to the Bluetooth functionality through
the Android Bluetooth APIs. These APIs let applications wirelessly
connect to other Bluetooth devices, enabling point-to-point and multipoint
wireless features.</p> 
 
<p>Using the Bluetooth APIs, an Android application can perform the
following:</p>
<ul>
  <li>Scan for other Bluetooth devices</li>
  <li>Query the local Bluetooth adapter for paired Bluetooth devices</li>
  <li>Establish RFCOMM channels</li>
  <li>Connect to other devices through service discovery</li>
  <li>Transfer data to and from other devices</li>
  <li>Manage multiple connections</li>
</ul>


<h2 id="TheBasics">The Basics</h2>

<p>This document describes how to use the Android Bluetooth APIs to accomplish
the four major tasks necessary to communicate using Bluetooth: setting up
Bluetooth, finding devices that are either paired or available in the local
area, connecting devices, and transferring data between devices.</p> 
 
<p>All of the Bluetooth APIs are available in the <code><a href="../../../reference/android/bluetooth/package-summary.html">android.bluetooth</a></code>
package. Here's a summary of the classes and interfaces you will need to create Bluetooth
connections:</p> 
 
<dl> 
<dt><code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code></dt> 
<dd>Represents the local Bluetooth adapter (Bluetooth radio). The
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code> is the entry-point for all Bluetooth
interaction. Using this,
you can discover other Bluetooth devices, query a list of bonded (paired)
devices, instantiate a <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code> using a known
MAC address, and create a <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> to
listen for communications
from other devices.</dd> 
 
<dt><code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code></dt> 
<dd>Represents a remote Bluetooth device. Use this to request a connection
with a remote device through a <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> or
query information about the
device such as its name, address, class, and bonding state.</dd> 
 
<dt><code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code></dt> 
<dd>Represents the interface for a Bluetooth socket (similar to a TCP
<code><a href="../../../reference/java/net/Socket.html">Socket</a></code>). This is the connection point that allows
an application to exchange data with another Bluetooth device via InputStream
and OutputStream.</dd> 
 
<dt><code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code></dt> 
<dd>Represents an open server socket that listens for incoming requests
(similar to a TCP <code><a href="../../../reference/java/net/ServerSocket.html">ServerSocket</a></code>). In order to connect two
Android devices, one device must open a server socket with this class. When a
remote Bluetooth device makes a connection request to the this device, the
<code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> will return a connected <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> when the
connection is accepted.</dd> 
 
<dt><code><a href="../../../reference/android/bluetooth/BluetoothClass.html">BluetoothClass</a></code></dt> 
<dd>Describes the general characteristics and capabilities of a Bluetooth
device. This is a read-only set of properties that define the device's major and
minor device classes and its services. However, this does not reliably describe
all Bluetooth profiles and services supported by the device, but is useful as a
hint to the device type.</dd> 
 
<dt><code><a href="../../../reference/android/bluetooth/BluetoothProfile.html">BluetoothProfile</a></code></dt> <dd>An interface that
represents a Bluetooth profile. A <em>Bluetooth profile</em> is a wireless
interface specification for Bluetooth-based communication between devices. An
example is the Hands-Free profile.  For more discussion of profiles, see <a
href="#Profiles">Working with Profiles</a></dd> 

<dt><code><a href="../../../reference/android/bluetooth/BluetoothHeadset.html">BluetoothHeadset</a></code></dt> <dd>Provides support for
Bluetooth headsets to be used with mobile phones. This includes both  Bluetooth
Headset and Hands-Free (v1.5) profiles.</dd> 

<dt><code><a href="../../../reference/android/bluetooth/BluetoothA2dp.html">BluetoothA2dp</a></code></dt> <dd> Defines how high quality
audio can be streamed from one device to another over a Bluetooth connection.
"A2DP" stands for Advanced Audio Distribution Profile.</dd> 

<dt><code><a href="../../../reference/android/bluetooth/BluetoothProfile.ServiceListener.html">BluetoothProfile.ServiceListener</a></code></dt> 

<dd>An interface that notifies <code><a href="../../../reference/android/bluetooth/BluetoothProfile.html">BluetoothProfile</a></code> IPC
clients when they have  been connected to or disconnected from the service (that
is, the internal service that runs a particular profile). </dd> 
 
</dl> 
 
 
 
 
<h2 id="Permissions">Bluetooth Permissions</h2> 
 
<p>In order to use Bluetooth features in your application, you need to declare
at least one of two Bluetooth permissions: <code><a href="../../../reference/android/Manifest.permission.html#BLUETOOTH">BLUETOOTH</a></code> and <code><a href="../../../reference/android/Manifest.permission.html#BLUETOOTH_ADMIN">BLUETOOTH_ADMIN</a></code>.</p> 
 
<p>You must request the <code><a href="../../../reference/android/Manifest.permission.html#BLUETOOTH">BLUETOOTH</a></code> permission
in order to perform any Bluetooth communication, such as requesting a
connection, accepting a connection, and transferring data.</p> 
 
<p>You must request the <code><a href="../../../reference/android/Manifest.permission.html#BLUETOOTH_ADMIN">BLUETOOTH_ADMIN</a></code>
permission in order to initiate device discovery or manipulate Bluetooth
settings. Most applications need this permission solely for the
ability to discover local Bluetooth devices. The other abilities granted by this
permission should not be used, unless the application is a "power manager" that
will modify Bluetooth settings upon user request. <strong>Note:</strong> If you
use <code><a href="../../../reference/android/Manifest.permission.html#BLUETOOTH_ADMIN">BLUETOOTH_ADMIN</a></code> permission, then must
also have the <code><a href="../../../reference/android/Manifest.permission.html#BLUETOOTH">BLUETOOTH</a></code> permission.</p> 
 
<p>Declare the Bluetooth permission(s) in your application manifest file. For
example:</p> 
 
<pre> 
&lt;manifest ... >
  &lt;uses-permission android:name="android.permission.BLUETOOTH" />
  ...
&lt;/manifest>
</pre> 
 
<p>See the <a
href="../../../guide/topics/manifest/uses-permission-element.html">&lt;uses-permission></a> 
reference for more information about declaring application permissions.</p> 
 
 
<h2 id="SettingUp">Setting Up Bluetooth</h2> 
 
<div class="figure" style="width:200px"> 
<img src="../../../images/bt_enable_request.png" /> 
<strong>Figure 1:</strong> The enabling Bluetooth dialog.
</div> 
 
<p>Before your application can communicate over Bluetooth, you need to verify
that Bluetooth is supported on the device, and if so, ensure that it is enabled.</p> 
 
<p>If Bluetooth is not supported, then you should gracefully disable any
Bluetooth features. If Bluetooth is supported, but disabled, then you can request that the
user enable Bluetooth without leaving your application. This setup is
accomplished in two steps, using the <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code>.</p> 
 
 
<ol> 
<li>Get the <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code>
<p>The <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code> is required for any and all Bluetooth
activity. To get the <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code>, call the static <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#getDefaultAdapter()">getDefaultAdapter()</a></code> method. This returns a
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code> that represents the device's own
Bluetooth adapter (the Bluetooth radio). There's one Bluetooth adapter for the
entire system, and your application can interact with it using this object. If
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#getDefaultAdapter()">getDefaultAdapter()</a></code> returns null,
then the device does not support Bluetooth and your story ends here. For example:</p> 
<pre> 
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
    // Device does not support Bluetooth
}
</pre> 
</li> 
 
<li>Enable Bluetooth
<p>Next, you need to ensure that Bluetooth is enabled. Call <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#isEnabled()">isEnabled()</a></code> to check whether Bluetooth is
currently enable. If this method returns false, then Bluetooth is disabled. To
request that Bluetooth be enabled, call <code><a href="../../../reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int)">startActivityForResult()</a></code>
with the <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#ACTION_REQUEST_ENABLE">ACTION_REQUEST_ENABLE</a></code> action Intent.
This will issue a request to enable Bluetooth through the system settings (without
stopping your application). For example:</p> 
<pre> 
if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
</pre> 
 
<p>A dialog will appear requesting user permission to enable Bluetooth, as shown
in Figure 1. If the user responds "Yes," the system will begin to enable Bluetooth
and focus will return to your application once the process completes (or fails).</p> 
<p>If enabling Bluetooth succeeds, your Activity will receive the <code><a href="../../../reference/android/app/Activity.html#RESULT_OK">RESULT_OK</a></code> result code in the <code><a href="../../../reference/android/app/Activity.html#onActivityResult(int, int, android.content.Intent)">onActivityResult()</a></code>
callback. If Bluetooth was not enabled
due to an error (or the user responded "No") then the result code will be <code><a href="../../../reference/android/app/Activity.html#RESULT_CANCELED">RESULT_CANCELED</a></code>.</p> 
</li> 
</ol> 
 
<p>Optionally, your application can also listen for the
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#ACTION_STATE_CHANGED">ACTION_STATE_CHANGED</a></code> broadcast Intent, which
the system will broadcast whenever the Bluetooth state has changed. This broadcast contains
the extra fields <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#EXTRA_STATE">EXTRA_STATE</a></code> and <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#EXTRA_PREVIOUS_STATE">EXTRA_PREVIOUS_STATE</a></code>, containing the new and old
Bluetooth states, respectively. Possible values for these extra fields are
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#STATE_TURNING_ON">STATE_TURNING_ON</a></code>, <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#STATE_ON">STATE_ON</a></code>, <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#STATE_TURNING_OFF">STATE_TURNING_OFF</a></code>, and <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#STATE_OFF">STATE_OFF</a></code>. Listening for this
broadcast can be useful to detect changes made to the Bluetooth state while your
app is running.</p> 
 
<p class="note"><strong>Tip:</strong> Enabling discoverability will automatically
enable Bluetooth. If you plan to consistently enable device discoverability before
performing Bluetooth activity, you can skip
step 2 above. Read about <a href="#EnablingDiscoverability">enabling discoverability</a>,
below.</p> 
 
 
<h2 id="FindingDevices">Finding Devices</h2> 
 
<p>Using the <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html">BluetoothAdapter</a></code>, you can find remote Bluetooth
devices either through device discovery or by querying the list of paired (bonded)
devices.</p> 
 
<p>Device discovery is a scanning procedure that searches the local area for
Bluetooth enabled devices and then requesting some information about each one
(this is sometimes referred to as "discovering," "inquiring" or "scanning").
However, a Bluetooth device within the local area will respond to a discovery
request only if it is currently enabled to be discoverable. If a device is
discoverable, it will respond to the discovery request by sharing some
information, such as the device name, class, and its unique MAC address. Using
this information, the device performing discovery can then choose to initiate a
connection to the discovered device.</p> 
 
<p>Once a connection is made with a remote device for the first time, a pairing
request is automatically presented to the user. When a device is
paired, the basic information about that device (such as the device name, class,
and MAC address) is saved and can be read using the Bluetooth APIs. Using the
known MAC address for a remote device, a connection can be initiated with it at
any time without performing discovery (assuming the device is within range).</p> 
 
<p>Remember there is a difference between being paired and being connected. To
be paired means that two devices are aware of each other's existence, have a
shared link-key that can be used for authentication, and are capable of
establishing an encrypted connection with each other. To be connected means that
the devices currently share an RFCOMM channel and are able to transmit data with
each other. The current Android Bluetooth API's require devices to be paired
before an RFCOMM connection can be established. (Pairing is automatically performed
when you initiate an encrypted connection with the Bluetooth APIs.)</p> 
 
<p>The following sections describe how to find devices that have been paired, or
discover new devices using device discovery.</p> 
 
<p class="note"><strong>Note:</strong> Android-powered devices are not
discoverable by default. A user can make
the device discoverable for a limited time through the system settings, or an
application can request that the user enable discoverability without leaving the
application. How to <a href="#EnablingDiscoverability">enable discoverability</a> 
is discussed below.</p> 
 
 
<h3 id="QueryingPairedDevices">Querying paired devices</h3> 
 
<p>Before performing device discovery, its worth querying the set
of paired devices to see if the desired device is already known. To do so,
call <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#getBondedDevices()">getBondedDevices()</a></code>. This
will return a Set of <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code>s representing
paired devices. For example, you can query all paired devices and then
show the name of each device to the user, using an ArrayAdapter:</p> 
<pre> 
Set&lt;BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
    // Loop through paired devices
    for (BluetoothDevice device : pairedDevices) {
        // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
    }
}
</pre> 
 
<p>All that's needed from the <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code> object
in order to initiate a connection is the MAC address. In this example, it's saved
as a part of an ArrayAdapter that's shown to the user. The MAC address can later
be extracted in order to initiate the connection. You can learn more about creating
a connection in the section about <a href="#ConnectingDevices">Connecting Devices</a>.</p> 
 
 
<h3 id="DiscoveringDevices">Discovering devices</h3> 
 
<p>To start discovering devices, simply call <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#startDiscovery()">startDiscovery()</a></code>. The
process is asynchronous and the method will immediately return with a boolean
indicating whether discovery has successfully started. The discovery process
usually involves an inquiry scan of about 12 seconds, followed by a page scan of
each found device to retrieve its Bluetooth name.</p> 
 
<p>Your application must register a BroadcastReceiver for the
<code><a href="../../../reference/android/bluetooth/BluetoothDevice.html#ACTION_FOUND">ACTION_FOUND</a></code> Intent in
order to receive information about each
device discovered. For each device, the system will broadcast the
<code><a href="../../../reference/android/bluetooth/BluetoothDevice.html#ACTION_FOUND">ACTION_FOUND</a></code> Intent. This
Intent carries the extra fields
<code><a href="../../../reference/android/bluetooth/BluetoothDevice.html#EXTRA_DEVICE">EXTRA_DEVICE</a></code> and
<code><a href="../../../reference/android/bluetooth/BluetoothDevice.html#EXTRA_CLASS">EXTRA_CLASS</a></code>, containing a
<code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code> and a <code><a href="../../../reference/android/bluetooth/BluetoothClass.html">BluetoothClass</a></code>, respectively. For example, here's how you can
register to handle the broadcast when devices are discovered:</p> 
<pre> 
// Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Get the BluetoothDevice object from the Intent
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            // Add the name and address to an array adapter to show in a ListView
            mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
        }
    }
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during onDestroy
</pre> 
 
<p>All that's needed from the <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code> object
in order to initiate a
connection is the MAC address. In this example, it's saved as a part of an
ArrayAdapter that's shown to the user. The MAC address can later be extracted in
order to initiate the connection. You can learn more about creating a connection
in the section about <a href="#ConnectingDevices">Connecting Devices</a>.</p> 
 
<p class="caution"><strong>Caution:</strong> Performing device discovery is
a heavy procedure for the Bluetooth
adapter and will consume a lot of its resources. Once you have found a device to
connect, be certain that you always stop discovery with
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#cancelDiscovery()">cancelDiscovery()</a></code> before
attempting a connection. Also, if you
already hold a connection with a device, then performing discovery can
significantly reduce the bandwidth available for the connection, so you should
not perform discovery while connected.</p> 
 
<h4 id="EnablingDiscoverability">Enabling discoverability</h4> 
 
<p>If you would like to make the local device discoverable to other devices,
call <code><a href="../../../reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int)">startActivityForResult(Intent, int)</a></code> with the
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#ACTION_REQUEST_DISCOVERABLE">ACTION_REQUEST_DISCOVERABLE</a></code> action
Intent. This will issue a request to enable discoverable mode through the system
settings (without stopping your application). By default, the device will become
discoverable for 120 seconds. You can define a different duration by adding the
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#EXTRA_DISCOVERABLE_DURATION">EXTRA_DISCOVERABLE_DURATION</a></code> Intent
extra. The maximum duration an app can set is 3600 seconds, and a value of 0
means the device is always discoverable. Any value below 0 or above 3600 is
automatically set to 120 secs). For example, this snippet sets the duration to
300:</p> 

<pre>Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
</pre> 
 
<div class="figure" style="width:200px"> 
<img src="../../../images/bt_enable_discoverable.png" /> 
<strong>Figure 2:</strong> The enabling discoverability dialog.
</div> 
 
<p>A dialog will be displayed, requesting user permission to make the device
discoverable, as shown in Figure 2. If the user responds "Yes," then the device
will become discoverable for the specified amount of time. Your Activity will
then receive a call to the <code><a href="../../../reference/android/app/Activity.html#onActivityResult(int, int, android.content.Intent)">onActivityResult())</a></code> callback, with the result code equal to the duration that the device
is discoverable. If the user responded "No" or if an error occurred, the result code will
be Activity.RESULT_CANCELLED.</p> 
 
<p class="note"><strong>Note:</strong> If Bluetooth has not been enabled on the device,
then enabling device discoverability will automatically enable Bluetooth.</p> 
 
<p>The device will silently remain in discoverable mode for the allotted time.
If you would like to be notified when the discoverable mode has changed, you can
register a BroadcastReceiver for the <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#ACTION_SCAN_MODE_CHANGED">ACTION_SCAN_MODE_CHANGED</a></code>
Intent. This will contain the extra fields <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#EXTRA_SCAN_MODE">EXTRA_SCAN_MODE</a></code> and
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#EXTRA_PREVIOUS_SCAN_MODE">EXTRA_PREVIOUS_SCAN_MODE</a></code>, which tell you the
new and old scan mode, respectively. Possible values for each are
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#SCAN_MODE_CONNECTABLE_DISCOVERABLE">SCAN_MODE_CONNECTABLE_DISCOVERABLE</a></code>,
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#SCAN_MODE_CONNECTABLE">SCAN_MODE_CONNECTABLE</a></code>, or <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#SCAN_MODE_NONE">SCAN_MODE_NONE</a></code>,
which indicate that the device is either in discoverable mode, not in
discoverable mode but still able to receive connections, or not in discoverable
mode and unable to receive connections, respectively.</p> 
 
<p>You do not need to enable device discoverability if you will be initiating
the connection to a remote device. Enabling discoverability is only necessary when
you want your application to host a server socket that will accept incoming
connections, because the remote devices must be able to discover the device
before it can initiate the connection.</p> 
 
 
 
<h2 id="ConnectingDevices">Connecting Devices</h2> 
 
<p>In order to create a connection between your application on two devices, you
must implement both the server-side and client-side mechanisms, because one
device must open a server socket and the other one must initiate the connection
(using the server device's MAC address to initiate a connection). The server and
client are considered connected to each other when they each have a connected
<code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> on the same RFCOMM channel. At this
point, each device can obtain input and output streams and data transfer can
begin, which is discussed in the section about <a
href="#ManagingAConnection">Managing a Connection</a>. This section describes how
to initiate the connection between two devices.</p> 
 
<p>The server device and the client device each obtain the required <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> in different ways. The server will receive it
when an incoming connection is accepted. The client will receive it when it
opens an RFCOMM channel to the server.</p> 
 
<div class="figure" style="width:200px"> 
<img src="../../../images/bt_pairing_request.png" /> 
<strong>Figure 3:</strong> The Bluetooth pairing dialog.
</div> 
 
<p>One implementation technique is to automatically prepare each device as a
server, so that each one has a server socket open and listening for connections.
Then either device can initiate a connection with the other and become the
client. Alternatively, one device can explicitly "host" the connection and open
a server socket on demand and the other device can simply initiate the
connection.</p> 
 
<p class="note"><strong>Note:</strong> If the two devices have not been previously paired,
then the Android framework will automatically show a pairing request notification or
dialog to the user during the connection procedure, as shown in Figure 3. So
when attempting to connect devices,
your application does not need to be concerned about whether or not the devices are
paired. Your RFCOMM connection attempt will block until the user has successfully paired,
or will fail if the user rejects pairing, or if pairing fails or times out. </p> 
 
 
<h3 id="ConnectingAsAServer">Connecting as a server</h3> 
 
<p>When you want to connect two devices, one must act as a server by holding an
open <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code>. The purpose of the server
socket is to listen for incoming connection requests and when one is accepted,
provide a connected <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>. When the <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> is acquired from the <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code>,
the <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> can (and should) be
discarded, unless you want to accept more connections.</p> 
 
<div class="sidebox-wrapper"> 
<div class="sidebox"> 
<h2>About UUID</h2> 
 
<p>A Universally Unique Identifier (UUID) is a standardized 128-bit format for a string
ID used to uniquely identify information. The point of a UUID is that it's big
enough that you can select any random and it won't clash. In this case, it's
used to uniquely identify your application's Bluetooth service. To get a UUID to
use with your application, you can use one of the many random UUID generators on
the web, then initialize a <code><a href="../../../reference/java/util/UUID.html">UUID</a></code> with <code><a href="../../../reference/java/util/UUID.html#fromString(java.lang.String)">fromString(String)</a></code>.</p> 
</div> 
</div> 
 
<p>Here's the basic procedure to set up a server socket and accept a
connection:</p> 
 
<ol> 
<li>Get a <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> by calling the
<code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#listenUsingRfcommWithServiceRecord(java.lang.String, java.util.UUID)">listenUsingRfcommWithServiceRecord(String, UUID)</a></code>.
<p>The string is an identifiable name of your service, which the system will
automatically write to a new Service Discovery Protocol (SDP) database entry on
the device (the name is arbitrary and can simply be your application name). The
UUID is also included in the SDP entry and will be the basis for the connection
agreement with the client device. That is, when the client attempts to connect
with this device, it will carry a UUID that uniquely identifies the service with
which it wants to connect. These UUIDs must match in order for the connection to
be accepted (in the next step).</p> 
</li> 
 
<li>Start listening for connection requests by calling
<code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#accept()">accept()</a></code>.
<p>This is a blocking call. It will return when either a connection has been
accepted or an exception has occurred. A connection is accepted only when a
remote device has sent a connection request with a UUID matching the one
registered with this listening server socket. When successful, <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#accept()">accept()</a></code> will
return a connected <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>.</p> 
</li> 
 
<li>Unless you want to accept additional connections, call
<code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#close()">close()</a></code>.
<p>This releases the server socket and all its resources, but does <em>not</em> close the
connected <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> that's been returned by <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#accept()">accept()</a></code>. Unlike TCP/IP, RFCOMM only allows one
connected client per channel at a time, so in most cases it makes sense to call <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#close()">close()</a></code> on the <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> immediately after accepting a connected
socket.</p> 
</li> 
</ol> 
 
<p>The <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#accept()">accept()</a></code> call should not
be executed in the main Activity UI thread because it is a blocking call and
will prevent any other interaction with the application. It usually makes
sense to do all work with a <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> or <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> in a new
thread managed by your application. To abort a blocked call such as <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#accept()">accept()</a></code>, call <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#close()">close()</a></code> on the <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> (or <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>) from another thread and the blocked call will
immediately return. Note that all methods on a <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> or <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>
are thread-safe.</p> 
 
<h4>Example</h4> 
 
<p>Here's a simplified thread for the server component that accepts incoming
connections:</p> 
<pre> 
private class AcceptThread extends Thread {
    private final BluetoothServerSocket mmServerSocket;
 
    public AcceptThread() {
        // Use a temporary object that is later assigned to mmServerSocket,
        // because mmServerSocket is final
        BluetoothServerSocket tmp = null;
        try {
            // MY_UUID is the app's UUID string, also used by the client code
            tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
        } catch (IOException e) { }
        mmServerSocket = tmp;
    }
 
    public void run() {
        BluetoothSocket socket = null;
        // Keep listening until exception occurs or a socket is returned
        while (true) {
            try {
                socket = mmServerSocket.accept();
            } catch (IOException e) {
                break;
            }
            // If a connection was accepted
            if (socket != null) {
                // Do work to manage the connection (in a separate thread)
                manageConnectedSocket(socket);
                mmServerSocket.close();
                break;
            }
        }
    }
 
    /** Will cancel the listening socket, and cause the thread to finish */
    public void cancel() {
        try {
            mmServerSocket.close();
        } catch (IOException e) { }
    }
}
</pre> 
 
<p>In this example, only one incoming connection is desired, so as soon as a
connection is accepted and the <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> is
acquired, the application
sends the acquired <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> to a separate
thread, closes the
<code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> and breaks the loop.</p> 
 
<p>Note that when <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#accept()">accept()</a></code>
returns the <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>, the socket is already
connected, so you should <em>not</em> call <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#connect()">connect()</a></code> (as you do from the
client-side).</p> 
 
<p><code>manageConnectedSocket()</code> is a fictional method in the application
that will
initiate the thread for transferring data, which is discussed in the section
about <a href="#ManagingAConnection">Managing a Connection</a>.</p> 
 
<p>You should usually close your <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code>
as soon as you are done listening for incoming connections. In this example, <code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html#close()">close()</a></code> is called as soon
as the <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> is acquired. You may also want
to provide a public method in your thread that can close the private <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> in the event that you need to stop listening on the
server socket.</p> 
 
 
<h3 id="ConnectingAsAClient">Connecting as a client</h3> 
 
<p>In order to initiate a connection with a remote device (a device holding an
open
server socket), you must first obtain a <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code> object that represents the remote device.
(Getting a <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code> is covered in the above
section about <a
href="#FindingDevices">Finding Devices</a>.) You must then use the
<code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code> to acquire a <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> and initiate the connection.</p> 
 
<p>Here's the basic procedure:</p> 
 
<ol> 
<li>Using the <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code>, get a <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> by calling <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html#createRfcommSocketToServiceRecord(java.util.UUID)">createRfcommSocketToServiceRecord(UUID)</a></code>.
<p>This initializes a <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code> that will
connect to the <code><a href="../../../reference/android/bluetooth/BluetoothDevice.html">BluetoothDevice</a></code>. The UUID passed here
must match the UUID used by the server device when it opened its
<code><a href="../../../reference/android/bluetooth/BluetoothServerSocket.html">BluetoothServerSocket</a></code> (with <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#listenUsingRfcommWithServiceRecord(java.lang.String, java.util.UUID)">listenUsingRfcommWithServiceRecord(String, UUID)</a></code>). Using the same UUID is simply a matter of hard-coding the UUID string
into your application and then referencing it from both the server and client
code.</p> 
</li> 
 
<li>Initiate the connection by calling <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#connect()">connect()</a></code>.
<p>Upon this call, the system will perform an SDP lookup on the remote device in
order to match the UUID. If the lookup is successful and the remote device
accepts the connection, it will share the RFCOMM channel to use during the
connection and <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#connect()">connect()</a></code> will return. This method is a
blocking call. If, for
any reason, the connection fails or the <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#connect()">connect()</a></code> method times out (after about
12 seconds), then it will throw an exception.</p> 
<p>Because <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#connect()">connect()</a></code> is a blocking call, this connection
procedure should always be performed in a thread separate from the main Activity
thread.</p> 
<p class="note">Note: You should always ensure that the device is not performing
device discovery when you call <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#connect()">connect()</a></code>. If discovery is in progress, then
the
connection attempt will be significantly slowed and is more likely to fail.</p> 
</li> 
</ol> 
 
<h4>Example</h4> 
 
<p>Here is a basic example of a thread that initiates a Bluetooth
connection:</p> 
<pre> 
private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;
 
    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;
        mmDevice = device;
 
        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try {
            // MY_UUID is the app's UUID string, also used by the server code
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) { }
        mmSocket = tmp;
    }
 
    public void run() {
        // Cancel discovery because it will slow down the connection
        mBluetoothAdapter.cancelDiscovery();
 
        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }
 
        // Do work to manage the connection (in a separate thread)
        manageConnectedSocket(mmSocket);
    }
 
    /** Will cancel an in-progress connection, and close the socket */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}
</pre> 
 
<p>Notice that <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#cancelDiscovery()">cancelDiscovery()</a></code> is called
before the connection is made. You should always do this before connecting and it is safe
to call without actually checking whether it is running or not (but if you do want to
check, call <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#isDiscovering()">isDiscovering()</a></code>).</p> 
 
<p><code>manageConnectedSocket()</code> is a fictional method in the application
that will initiate the thread for transferring data, which is discussed in the section
about <a href="#ManagingAConnection">Managing a Connection</a>.</p> 
 
<p>When you're done with your <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>, always
call <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#close()">close()</a></code> to clean up.
Doing so will immediately close the connected socket and clean up all internal
resources.</p> 
 
 
<h2 id="ManagingAConnection">Managing a Connection</h2> 
 
<p>When you have successfully connected two (or more) devices, each one will
have a connected <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>. This is where the fun
begins because you can share data between devices. Using the <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>, the general procedure to transfer arbitrary data is
simple:</p> 
<ol> 
<li>Get the <code><a href="../../../reference/java/io/InputStream.html">InputStream</a></code> and <code><a href="../../../reference/java/io/OutputStream.html">OutputStream</a></code> that
handle transmissions through the socket, via <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#getInputStream()">getInputStream()</a></code> and
<code><a href="../../../reference/android/bluetooth/BluetoothSocket.html#getOutputStream()">getOutputStream()</a></code>, respectively.</li> 
 
<li>Read and write data to the streams with <code><a href="../../../reference/java/io/InputStream.html#read(byte[])">read(byte[])</a></code> and <code><a href="../../../reference/java/io/OutputStream.html#write(byte[])">write(byte[])</a></code>.</li> 
</ol> 
 
<p>That's it.</p> 
 
<p>There are, of course, implementation details to consider. First and foremost,
you should use a dedicated thread for all stream reading and writing. This is
important because both <code><a href="../../../reference/java/io/InputStream.html#read(byte[])">read(byte[])</a></code> and <code><a href="../../../reference/java/io/OutputStream.html#write(byte[])">write(byte[])</a></code> methods are blocking calls. <code><a href="../../../reference/java/io/InputStream.html#read(byte[])">read(byte[])</a></code> will block until there is something to read
from the stream. <code><a href="../../../reference/java/io/OutputStream.html#write(byte[])">write(byte[])</a></code> does not usually
block, but can block for flow control if the remote device is not calling <code><a href="../../../reference/java/io/InputStream.html#read(byte[])">read(byte[])</a></code> quickly enough and the intermediate buffers are full.
So, your main loop in the thread should be dedicated to reading from the <code><a href="../../../reference/java/io/InputStream.html">InputStream</a></code>. A separate public method in the thread can be used to initiate
writes to the <code><a href="../../../reference/java/io/OutputStream.html">OutputStream</a></code>.</p> 
 
<h4>Example</h4> 
 
<p>Here's an example of how this might look:</p> 
<pre> 
private class ConnectedThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final InputStream mmInStream;
    private final OutputStream mmOutStream;
 
    public ConnectedThread(BluetoothSocket socket) {
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;
 
        // Get the input and output streams, using temp objects because
        // member streams are final
        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (IOException e) { }
 
        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }
 
    public void run() {
        byte[] buffer = new byte[1024];  // buffer store for the stream
        int bytes; // bytes returned from read()
 
        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);
                // Send the obtained bytes to the UI Activity
                mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
                        .sendToTarget();
            } catch (IOException e) {
                break;
            }
        }
    }
 
    /* Call this from the main Activity to send data to the remote device */
    public void write(byte[] bytes) {
        try {
            mmOutStream.write(bytes);
        } catch (IOException e) { }
    }
 
    /* Call this from the main Activity to shutdown the connection */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}
</pre> 
 
<p>The constructor acquires the necessary streams and once executed, the thread
will wait for data to come through the InputStream. When <code><a href="../../../reference/java/io/InputStream.html#read(byte[])">read(byte[])</a></code> returns with
bytes from the stream, the data is sent to the main Activity using a member
Handler from the parent class. Then it goes back and waits for more bytes from
the stream.</p> 
 
<p>Sending outgoing data is as simple as calling the thread's
<code>write()</code> method from the main Activity and passing in the bytes to
be sent. This method then simply calls <code><a href="../../../reference/java/io/OutputStream.html#write(byte[])">write(byte[])</a></code> to send the data to the remote device.</p> 
 
<p>The thread's <code>cancel()</code> method is important so that the connection
can be
terminated at any time by closing the <code><a href="../../../reference/android/bluetooth/BluetoothSocket.html">BluetoothSocket</a></code>.
This should always be called when you're done using the Bluetooth
connection.</p> 
 
<div class="special"> 
<p>For a  demonstration of using the Bluetooth APIs, see the <a
href="../../../resources/samples/BluetoothChat/index.html">Bluetooth Chat sample app</a>.</p> 
</div> 

<h2 id="Profiles">Working with Profiles</h2> 

<p>Starting in Android 3.0, the Bluetooth API includes support for working with
Bluetooth profiles. A <em>Bluetooth profile</em> is a wireless interface
specification for Bluetooth-based communication between devices. An example
is the Hands-Free profile. For a mobile phone to connect to a wireless headset,
both devices must support the Hands-Free profile. </p> 

<p>You can implement the interface <code><a href="../../../reference/android/bluetooth/BluetoothProfile.html">BluetoothProfile</a></code> to write
your own classes to support a particular Bluetooth profile. The Android
Bluetooth API provides implementations for the following Bluetooth
profiles:</p> 
<ul> 

  <li><strong>Headset</strong>. The Headset profile provides support for
Bluetooth headsets to be used with mobile phones. Android provides the <code><a href="../../../reference/android/bluetooth/BluetoothHeadset.html">BluetoothHeadset</a></code> class, which is a proxy for controlling the
Bluetooth Headset Service via interprocess communication (<a
href="../../../guide/topics/fundamentals/processes-and-threads.html#IPC">IPC</a
>). This includes both  Bluetooth Headset and Hands-Free (v1.5) profiles. The
<code><a href="../../../reference/android/bluetooth/BluetoothHeadset.html">BluetoothHeadset</a></code> class includes support for AT commands.
For more discussion of this topic, see <a href="#AT-Commands">Vendor-specific AT commands</a></li> 

  <li><strong>A2DP</strong>. The Advanced Audio Distribution Profile (A2DP)
profile defines how high quality audio can be streamed from one device to
another over a Bluetooth connection. Android provides the <code><a href="../../../reference/android/bluetooth/BluetoothA2dp.html">BluetoothA2dp</a></code> class, which is a proxy for controlling
the Bluetooth A2DP  Service via IPC.</li> 

</ul> 

<p>Here are the basic steps for working with a profile:</p> 
<ol> 

  <li>Get the default adapter, as described in <a href="../../../guide/topics/wireless/bluetooth.
html#SettingUp">Setting Up Bluetooth</a>.</li> 

  <li>Use <code><a href="../../../reference/android/bluetooth/BluetoothAdapter.html#getProfileProxy(android.content.Context, android.bluetooth.BluetoothProfile.ServiceListener, int)">getProfileProxy()</a></code> to
establish a connection to the profile proxy object associated with the profile.
In the example below, the profile proxy object is an instance of <code><a href="../../../reference/android/bluetooth/BluetoothHeadset.html">BluetoothHeadset</a></code>. </li> 

  <li>Set up a  <code><a href="../../../reference/android/bluetooth/BluetoothProfile.ServiceListener.html">BluetoothProfile.ServiceListener</a></code>. This
listener notifies <code><a href="../../../reference/android/bluetooth/BluetoothProfile.html">BluetoothProfile</a></code> IPC clients when
they have been connected to or disconnected from the service.</li> 

  <li>In <code><a href="../../../reference/android/bluetooth/BluetoothProfile.ServiceListener.html#onServiceConnected(int, android.bluetooth.BluetoothProfile)">onServiceConnected()</a></code>, get a handle
to the profile proxy object.</li> 

  <li>Once you have the profile proxy object, you can use it to monitor the
state of the connection and perform other operations that are relevant to that
profile.</li> 
</ol> 
<p> For example, this code snippet shows how to connect to a <code><a href="../../../reference/android/bluetooth/BluetoothHeadset.html">BluetoothHeadset</a></code> proxy object so that you can control the
Headset profile:</p> 

<pre>BluetoothHeadset mBluetoothHeadset;
 
// Get the default adapter
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
 
// Establish connection to the proxy.
mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET);
 
private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() {
    public void onServiceConnected(int profile, BluetoothProfile proxy) {
        if (profile == BluetoothProfile.HEADSET) {
            mBluetoothHeadset = (BluetoothHeadset) proxy;
        }
    }
    public void onServiceDisconnected(int profile) {
        if (profile == BluetoothProfile.HEADSET) {
            mBluetoothHeadset = null;
        }
    }
};
 
// ... call functions on mBluetoothHeadset
 
// Close proxy connection after use.
mBluetoothAdapter.closeProfileProxy(mBluetoothHeadset);
</pre> 

<h3 id="AT-Commands">Vendor-specific AT commands</h3> 

<p>Starting in Android 3.0, applications can register to receive system
broadcasts of pre-defined vendor-specific AT commands sent by headsets (such as
a Plantronics +XEVENT command). For example, an application could receive
broadcasts that indicate a connected device's battery level and could notify the
user or take other action as needed. Create a broadcast receiver for the <code><a href="../../../reference/android/bluetooth/BluetoothHeadset.html#ACTION_VENDOR_SPECIFIC_HEADSET_EVENT">ACTION_VENDOR_SPECIFIC_HEADSET_EVENT</a></code> intent
to handle vendor-specific AT commands for the headset.</p>

    </div>

  <a href="#top" style="float:right">&uarr; Go to top</a>
  
  </div>

<div id="footer">


  <div id="copyright">
    
  Except as noted, this content is licensed under <a
  href="http://www.apache.org/licenses/LICENSE-2.0">Apache 2.0</a>. 
  For details and restrictions, see the <a href="../../../license.html">
  Content License</a>.
  </div>
  <div id="build_info">
    
  Android 4.0&nbsp;r1 - 17 Oct 2011 18:17

  </div>

  <div id="footerlinks">
    
  <p>
    <a href="http://www.android.com/terms.html">Site Terms of Service</a> -
    <a href="http://www.android.com/privacy.html">Privacy Policy</a> -
    <a href="http://www.android.com/branding.html">Brand Guidelines</a>
  </p>
  </div>

</div> <!-- end footer -->

</div><!-- end doc-content -->

</div> <!-- end body-content --> 

<script type="text/javascript">
init(); /* initialize android-developer-docs.js */
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-5831155-1");
pageTracker._trackPageview();
</script>

</body>
</html>



